home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / magazyn_amiga / 5 / ami032_przeniesc_vbr.txt < prev    next >
Text File  |  1997-09-16  |  7KB  |  171 lines

  1.  
  2. PRZENIEÔÊ VBR
  3.  
  4. <lead>Gdy chcemy przyspieszyê komputer, kupujemy dopalacz i sporo
  5. pamiëci. Po wîâczeniu wszelkich moûliwych burstów i cache'ów
  6. rozkoszujemy sië prëdkoôciâ systemu i oglâdamy wyniki testów z
  7. przekonaniem, ûe nic wiëcej nie da sië juû zrobiê. Czy
  8. rzeczywiôcie?
  9.  
  10. <a>Michaî i Piotr Koîodziejczykowie
  11.  
  12. <txt>Wpîyw prëdkoôci przerwaï na wydajnoôê systemu jest zwykle
  13. marginalizowany. I sîusznie, poniewaû w temacie tym niewiele da
  14. sië zrobiê, a efekty i tak bëdâ prawie ûadne. Prawie. Niekiedy
  15. jednak (np. przy transmisji szeregowej) przerwania wywoîywane sâ
  16. parëdziesiât tysiëcy razy na sekundë. Informacje o przerwaniu
  17. przechowywane sâ w pamiëci Chip, która, przy sprzyjajâcych
  18. okolicznoôciach, jest dziesiëciokrotnie wolniejsza od pamiëci
  19. Fast(*).
  20.  
  21. Procesor otrzymujâc przerwanie pobiera adres funkcji, która je
  22. obsîuguje, z tablicy wektorów. Tablica ta (zawierajâca ponadto
  23. wektory wyjâtków -- exeption) w procesorze MC68000 umieszczona
  24. jest w pierwszych 512 bajtach pamiëci, czyli w pamiëci Chip.
  25. Poczâwszy od procesora MC68010 tablicë wektorów umieszczaê moûna
  26. w dowolnym obszarze pamiëci, a jej adres ustala nowy rejestr
  27. procesora -- VBR (Vector Base Register). Zgodnie z zaîoûeniem
  28. miaîo to umoûliwiê posiadanie przez kaûde z zadaï wîasnej tablicy
  29. wektorów. W Amidze nie jest to wykorzystywane, VBR posîuûyê nam
  30. moûe jednak do przeniesienia tablicy wektorów do pamiëci Fast.
  31. Jednym z efektów takiego dziaîania bëdzie przyspieszenie
  32. wykonywania przerwaï i wyjâtków.
  33.  
  34. Dostëp do rejestru VBR, jak i czëôci innych sterujâcych procesorem,
  35. odbywa sië za pomocâ rozkazu movec, np.:
  36.  
  37. <l>movec    a0,VBR    ; wpisanie do VBR zawartoôci a0
  38.  
  39. movec    CACR,d0    ; odczytanie trybu pracy pamiëci CACHE
  40.  
  41.             ; (od 68020 w górë)
  42.  
  43. <txt>Uwaga! Niektóre asemblery wymagajâ podania rozmiaru
  44. operandu, czyli skîadni "movec.l".
  45.  
  46. Procesory z rodziny MC68000 projektowane byîy do pracy w
  47. systemach wielozadaniowych. Zaîoûono, ûe procesor bëdzie pracowaî
  48. w dwóch trybach: uûytkownika i nadzorcy. W trybie uûytkownika
  49. wykonywane sâ wszelkie programy uûytkowe, natomiast tryb nadzorcy
  50. zarezerwowany jest dla systemu operacyjnego.
  51.  
  52. Instrukcje sterujâce procesorem, ze wzglëdu na powaûne
  53. konsekwencje ich bîëdnego uûycia, zostaîy zarezerwowane dla trybu
  54. nadzorcy. Jednâ z takich instrukcji jest wîaônie interesujâca nas
  55. movec. Jej wywoîanie z trybu uûytkownika koïczy sië obejrzeniem
  56. GURU z numerem 00000008 (naruszenie przywileju).
  57.  
  58. Przed wykonaniem movec musimy wiëc przejôê do trybu nadzorcy, a
  59. nastëpnie powróciê do trybu uûytkownika. Poniewaû metody zmiany
  60. trybu pracy procesora nie byîy jeszcze nigdzie opisane, zajmiemy
  61. sië tu nimi szerzej.
  62.  
  63. Biblioteka Exec oferuje dwa sposoby przejôcia do trybu nadzorcy.
  64. Pierwszym z nich jest funkcja Supervisor(). Dla piszâcych w jëzyku C
  65. ma ona takâ skîadnië:
  66.  
  67. <l>Wynik=Supervisor(Funkcja);
  68.  
  69. ULONG Supervisor(void *);
  70.  
  71. <txt>Przechodzi do trybu nadzorcy, wykonuje podanâ jej funkcjë
  72. programisty i powraca w tryb uûytkownika. Adres funkcji podaje
  73. sië w rejestrze A5. Dla funkcji programisty obowiâzujâ takie same
  74. zasady, jak dla funkcji obsîugi przerwaï. Dodatkowo koïczyê musi
  75. sië ona instrukcjâ rte. Przy powrocie do programu nie sâ
  76. zmieniane rejestry -- pozostaje w nich to, co wpisaîa funkcja
  77. programisty. Moûna to wykorzystaê do zwrotu wartoôci.
  78.  
  79. Supervisor() ma jednak wadë: Przy przejôciu do trybu nadzorcy
  80. rejestr SP (Stack Pointer) nie wskazuje na dotychczasowy stos
  81. uûytkownika, lecz na stos nadzorcy. Dlatego teû do wywoîywanej
  82. funkcji (i z powrotem) nie moûna przekazywaê argumentów przez
  83. stos.
  84.  
  85. Drugâ moûliwoôciâ zmiany trybu pracy sâ instrukcje SuperState() i
  86. UserState(). Umoûliwiajâ one przejôcie do trybu nadzorcy i
  87. uûytkownika w trakcie wykonywania programu, w dowolnym momencie.
  88.  
  89. <l>StosNadzorcy=SuperState();
  90.  
  91. APTR SuperState(void);
  92.  
  93. <txt>Przechodzi w tryb nadzorcy, przy czym SP wskazuje dalej na
  94. stos uûytkownika (dotychczasowy). Moûna wiëc z niego do woli
  95. korzystaê (zmienne klasy auto pozostajâ waûne). W rejestrze D0
  96. otrzymujemy wskaúnik stosu nadzorcy. Nie jest on zwykle do
  97. niczego potrzebny, naleûy go jednak zachowaê, gdyû konieczny
  98. bëdzie przy powrocie do trybu uûytkownika.
  99.  
  100. <l>UserState(StosNadzorcy);
  101.  
  102. void UserState(APTR);
  103.  
  104. <txt>Powraca do trybu uûytkownika po wywoîaniu SuperState(). W
  105. rejestrze D0 podaê musimy wskaúnik stosu nadzorcy, zwrócony przez
  106. poprzedniâ funkcjë.
  107.  
  108. Uwaga! Na czas pomiëdzy SuperState() i UserState() stosem
  109. nadzorcy bëdzie nasz stos uûytkownika. Musi byê na nim
  110. odpowiednia iloôê miejsca dla ewentualnych przerwaï i wyjâtków.
  111.  
  112. Dla potrzeb programu przenoszâcego tablicë wektorów wygodniejsze
  113. bëdzie skorzystanie z funkcji Supervisor().
  114.  
  115. Przed wykonaniem instrukcji movec musimy sië upewniê, czy w
  116. komputerze zamontowany jest procesor MC68010 lub wyûszy.
  117. Wykonanie movec na MC68000 zakoïczy sië GURU. O procesorze
  118. informuje nas pole AttnFlags w bazie biblioteki Exec. W bajcie
  119. tym ustawione sâ nastëpujâce bity w zaleûnoôci od rodzaju
  120. procesora: 0 -- MC68010, 1 -- MC68020, 2 -- MC68030, 3 --
  121. MC68040; dalsze bity odpowiadajâ za koprocesor. Ustawione sâ przy
  122. tym wszystkie bity mîodsze, np. jeôli zainstalowany jest MC68020,
  123. ustawione sâ bity 0 i 1.
  124.  
  125. I jeszcze krótki opis funkcji, wystëpujâcych w programie:
  126.  
  127. Forbid() i Permit() -- blokuje i odblokowuje wykonywanie innych
  128. zadaï. Nie podaje sië im ûadnych argumentów, nie zwracajâ teû
  129. ûadnej wartoôci. W programie wykorzystane w czasie kopiowania i
  130. zmiany tablicy wektorów, by inny program w tym czasie nie zmieniî
  131. ûadnego wektoru.
  132.  
  133. AllocMem() -- rezerwuje obszar pamiëci (w programie na nowâ
  134. tablicë wektorów). W D0 podaje sië rozmiar, w D1 cechy pamiëci. W
  135. D0 zwracany jest adres zarezerwowanego bloku lub 0, jeôli nie
  136. moûna byîo go przydzieliê. Normalnie pamiëê powinna byê zwolniona
  137. przez FreeMem() przed wyjôciem z programu, tu jednak musi ona
  138. pozostaê zarezerwowana.
  139.  
  140. CopyMemQuick() -- kopiuje blok pamiëci. W A0 podaje sië jego
  141. adres, w A1 adres docelowy, a w D0 rozmiar bloku. Wszystkie te
  142. wartoôci muszâ byê podzielne przez 4.
  143.  
  144. Po sprawdzeniu procesora program sprawdza takûe zawartoôê rejestru
  145. VBR -- jeôli jest róûna od 0, oznacza to, ûe tablica wektorów byîa
  146. juû przemieszczana.
  147.  
  148. Poniûszy przykîadowy program, przemieszczajâcy tablicë wektorów
  149. do pamiëci Fast, moûe byê kompilowany dowolnym asemblerem. Nie
  150. wymaga ûadnych dodatkowych plików. Podczas kompilacji
  151. prawdopodobnie otrzymamy ostrzeûenia o uûyciu instrukcji
  152. procesora MC68010. Kod wynikowy bëdzie krótszy niû 200 bajtów.
  153. Gdy tablica wektorów znajdzie sië w pamiëci Fast, niektóre gry i
  154. dema mogâ sië zawieszaê (zakîadajâ one, ûe wektory znajdujâ sië
  155. pod adresem 0 i uûywajâ wîasnych funkcji do ich zmiany).
  156.  
  157. ******************** TU LISTING ******************
  158.  
  159. <przyp>(*) Dla niedowiarków:
  160.  
  161. Pamiëê Chip niezaleûnie od komputera (jak dotychczas) taktowana
  162. jest zegarem ok. 7 MHz. Pamiëê Fast na kartach turbo, np. 33 MHz.
  163. Mamy wiëc juû niemal 5-krotne przyspieszenie. Dodatkowo pamiëê
  164. Chip, przy duûej liczbie kolorów i rozdzielczoôci obrazu, moûe
  165. byê spowalniana przez ukîady graficzne. Do tego dochodzâ
  166. koprocesory: Cooper i blitter. W efekcie dwukrotne spowolnienie
  167. nietrudno uzyskaê. W sumie mamy 10 razy. A nie sâ to wartoôci
  168. skrajne: mogâ byê bowiem jeszcze szybsze pamiëci Fast, a
  169. maksymalne spowolnienie procesora na pamiëci Chip jest
  170. trzykrotne.
  171.